Amazon Pinpoint のエンドポイントステータスが INACTIVE となる理由を教えてください。
困っていた内容
Amazon Pinpoint のエンドポイントステータスがINACTIVE
となり該当エンドポイントにメールを送信できません。エンドポイント作成時にはACTIVE
と指定していますが、なぜエンドポイントがINACTIVE
に変わったのでしょうか。
ステータスが INACTIVE になる理由
Amazon Pinpoint のエンドポイントステータスにはACTIVE
とINACTIVE
があり、ステータスがACTIVE
のとき、そのエンドポイントにメッセージが送信されます。
このステータスは、エンドポイント作成・更新時に自動的にACTIVE
に設定され、同じAddress
プロパティを持つ別のエンドポイントが作成・更新された際に、自動的にINACTIVE
に設定されます。
同じAddress
プロパティを持つエンドポイントが作成された際のステータスは、時系列に表すと以下のとおり変化します。
- エンドポイントID 123 が作成されると、エンドポイントID 123 のステータスは
ACTIVE
となる - エンドポイントID 456 が作成されると、エンドポイントID 456 のステータスは
ACTIVE
となる- 同じ
Address
プロパティを持つエンドポイントID 456 が作成されたため、エンドポイント ID 123 のステータスがINACTIVE
となる
- 同じ
そのため、エンドポイントのステータスがINACTIVE
となった際は、同じAddress
プロパティを持つエンドポイントが別途存在し、そのエンドポイントが作成・更新されたことになります。
同じ Address プロパティを持つエンドポイントの調査方法
2022年2月14日現在、Address
プロパティからエンドポイントを検索できる API や、エンドポイントをリストで取得する API は公開されていないようです。
そのため、AWS CLI で create-export-job を使用してエンドポイント一覧が出力されたファイルを S3 バケットにエクスポートすることで、同じAddress
プロパティを持つエンドポイントを調査できます。(SDK なども利用できます。詳細は公式ドキュメントをご確認ください。)
以下では実際にエンドポイント一覧をエクスポートしてみます。
前提として、エクスポートする S3 バケットと、エクスポートに必要な権限を有した IAM ロールを用意しておきます。
IAM ロールの信頼関係や権限は以下を設定しましたが、検証のため権限は広めに取っています。
最小権限を設定したい場合は、公式ドキュメントをご参照ください。
・信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pinpoint.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
・権限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUserToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowAllS3ActionsInUserFolder", "Action": [ "s3:*" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::pinpoint-export-111111111111/*" ] } ] }
S3 バケットと IAM ロールを作成した前提で、以下のコマンドを実行します。
aws pinpoint create-export-job \ --application-id xxxx \ --export-job-request \ S3UrlPrefix=s3://pinpoint-export-111111111111/20220213,\ RoleArn=arn:aws:iam::111111111111:role/pinpoint-export-job-role
S3 バケットにファイルが出力されますので、ダウンロードします。
ダウンロードしたファイルの中身が以下です。
{"ChannelType":"EMAIL","Address":"xxx@gmail.com","EndpointStatus":"INACTIVE","OptOut":"NONE","RequestId":"312cdf8d-8930-4aee-831d-5acc16fc3f21","Demographic":{"Make":"Apple"},"EffectiveDate":"2021-12-23T02:55:22.445Z","User":{"UserId":"123","UserStatus":"ACTIVE"},"ApplicationId":"xxxx","Id":"xxx","CreationDate":"2021-12-23T02:49:25.279Z"} {"ChannelType":"EMAIL","Address":"xxx@gmail.com","EndpointStatus":"ACTIVE","OptOut":"NONE","RequestId":"329a58e1-baf7-4b71-a71e-ccd517eaa389","Demographic":{"Make":"Apple"},"EffectiveDate":"2021-12-23T03:07:36.779Z","User":{"UserId":"123","UserStatus":"ACTIVE"},"ApplicationId":"xxxx","Id":"xxx","CreationDate":"2021-12-23T02:53:50.033Z"}
私は検証用のエンドポイントを 2 つ作成していたので、同じAddress
「xxx@gmail.com」を持つエンドポイントが 2 つ出力されています。
上記のプロパティ EffectiveDate はエンドポイントが更新された日時を表しますが、その日時が新しい方のエンドポイントのステータスがACTIVE
となっており、古い方のエンドポイントのステータスがINACTIVE
になっていることが分かります。
参考資料
Looking up endpoints with Amazon Pinpoint
Exporting endpoints from Amazon Pinpoint